home *** CD-ROM | disk | FTP | other *** search
- /*
- * cpu.addrs.h
- *
- * @(#)cpu.addrs.h 1.3 88/02/08 SMI
- * Copyright (c) 1986 by Sun Microsystems, Inc.
- *
- * Memory Addresses of interest in the Sun-4 Monitor memory map.
- *
- * Since "sunromvec.h" is exported to the world, a change invalidates all
- * object programs that use it (e.g. stand-alone diagnostics, demos, boot
- * code, etc.) until they are re-compiled with the new version of include
- * file "sunromvec.h". As a transition aid, it is often useful to specially
- * map the old "sunromvec" location(s) so they also work.
- */
-
- /*
- * Address Space Identifier. Formerly function codes in 68000 land.
- */
- /*#define ASI_CTL 0x2 /* control space */
- /*#define ASI_SM 0x3 /* segment map */
- /*#define ASI_PM 0x4 /* page map */
- /*#define ASI_UP 0x8 /* user program */
- /*#define ASI_SP 0x9 /* supervisor program */
- /*#define ASI_UD 0xA /* user data */
- /*#define ASI_SD 0xB /* supervisor data */
- /*#define ASI_FCS 0xC /* flush cache segment */
- /*#define ASI_FCP 0xD /* flush cache page */
- /*#define ASI_FCC 0xE /* flush cache context */
- /*#define ASI_CD 0xF /* cache data */
-
- /*
- * According to the architecture manual, the three uppermost (most
- * significant) virtual address bits must be equal (either "000" or
- * "111"). Therfore, virtual addresses 0x20000000 through 0xdfffffff,
- * inclusive, are illegal.
- */
- #define INVALID_ADDRESS_START 0x20000000
- #define INVALID_ADDRESS_END 0xE0000000
-
- /*
- * The following define the base addresses in mappable memory where
- * the various devices and forms of memory are mapped in when the EPROM
- * Monitor powers up. On-going operation of the monitor requires that
- * these locations remain mapped as they were.
- */
- #define KEYBMOUSE_BASE ((struct zscc_device *) 0xFFD00000) /* On */
- #define SERIAL0_BASE ((struct zscc_device *) 0xFFD02000) /* board */
- #define EEPROM_BASE ((unsigned char *) 0xFFD04000) /* input */
- #define CLOCK_BASE ((struct intersil7170 *) 0xFFD06000) /* and */
- #define MEMORY_ERR_BASE ((struct memreg *) 0xFFD08000) /* output */
- #define INTERRUPT_BASE ((unsigned char *) 0xFFD0A000) /* devices. */
- #define ETHER_BASE ((struct obie_device *) 0xFFD0C000)
- #define ETHER_CR_BASE ((unsigned char *) 0xF6000000)
- #define COLORMAP_BASE ((struct obcolormap *) 0xFFD0E000)
- #define AMD_ETHER_BASE ((struct amd_ether *) 0xFFD10000)
- #define SCSI_BASE ((struct scsichip *) 0xFFD12000)
- #define DES_BASE ((struct deschip *) 0xFFD14000)
- #define ECC_CTRL_BASE ((struct ecc_ctrl *) 0xFFD16000)
-
- #define ETHER_CR_INT (0x10) /* Ethernet Control Reg Enable Interrupt bit. */
- #define ETHER_CR_CAT (0x20) /* Ethernet Control Reg Channel Attention bit. */
- #define ETHER_CR_LOOPB (0x30) /* Ethernet Control Reg Loop Back bit. */
- #define ETHER_CR_RESET (0x40) /* Ethernet Control Reg RESET bit. */
-
- #define VIDEOMEM_BASE ((char *) 0xFFD40000) /* Video memory. */
-
- #define ETHER_SCP_OFF 0xfffffff6 /* Virtual address for ethernet SCP. */
-
- #ifdef COBRA
- #define BW_ENABLE_MEM_BASE ((char *) 0xFFB00000)
- #define BW_ENABLE_MEM_SIZE 0x40000
- #define COLOR_FB_BASE ((char *) 0xFFC00000)
- #define COLOR_FB_SIZE 0x100000
- #endif COBRA
-
- /*
- * Handy place to map the invalid PMEG. Also red zone for stack.
- */
- #define INVPMEG_BASE ((char *) 0xFFD80000)
-
- /*
- * Monitor scratch RAM. One page for the STACK.
- * One page for the TRAP VECTOR TABLE and FONT TABLE.
- */
- #define STACK_BASE ((char *) 0xFFDC0000)
- #define STACK_TOP ((char *) 0xFFDC2000)
- #define TRAP_VECTOR_BASE (0xFFDC2000)
- #define FONT_BASE ((char *) 0xFFDC2400)
-
- #define NUMBER_OF_TRAPS 256
- /*
- * These definitions allow easy and accurate access into the TRAP VECTOR TABLE.
- */
- #define HARD_RESET (TRAP_VECTOR_BASE)
- #define INSTRUCTION_ACCESS_EXCEPTION (TRAP_VECTOR_BASE+4)
- #define ILLEGAL_INSTRUCTION (TRAP_VECTOR_BASE+2*4)
- #define PRIVELEGED_INSTRUCTION (TRAP_VECTOR_BASE+3*4)
- #define FP_DISABLED (TRAP_VECTOR_BASE+4*4)
- #define WINDOW_OVERFLOW (TRAP_VECTOR_BASE+5*4)
- #define WINDOW_UNDERFLOW (TRAP_VECTOR_BASE+6*4)
- #define MEMORY_ADDRESS_NOT_ALIGNED (TRAP_VECTOR_BASE+7*4)
- #define FP_EXCEPTION (TRAP_VECTOR_BASE+8*4)
- #define DATA_ACCESS_EXCEPTION (TRAP_VECTOR_BASE+9*4)
- #define TAG_OVERFLOW (TRAP_VECTOR_BASE+10*4)
- #define INTERRUPT_LEVEL_1 (TRAP_VECTOR_BASE+17*4)
- #define INTERRUPT_LEVEL_2 (TRAP_VECTOR_BASE+18*4)
- #define INTERRUPT_LEVEL_3 (TRAP_VECTOR_BASE+19*4)
- #define INTERRUPT_LEVEL_4 (TRAP_VECTOR_BASE+20*4)
- #define INTERRUPT_LEVEL_5 (TRAP_VECTOR_BASE+21*4)
- #define INTERRUPT_LEVEL_6 (TRAP_VECTOR_BASE+22*4)
- #define INTERRUPT_LEVEL_7 (TRAP_VECTOR_BASE+23*4)
- #define INTERRUPT_LEVEL_8 (TRAP_VECTOR_BASE+24*4)
- #define INTERRUPT_LEVEL_9 (TRAP_VECTOR_BASE+25*4)
- #define INTERRUPT_LEVEL_10 (TRAP_VECTOR_BASE+26*4)
- #define INTERRUPT_LEVEL_11 (TRAP_VECTOR_BASE+27*4)
- #define INTERRUPT_LEVEL_12 (TRAP_VECTOR_BASE+28*4)
- #define INTERRUPT_LEVEL_13 (TRAP_VECTOR_BASE+29*4)
- #define INTERRUPT_LEVEL_14 (TRAP_VECTOR_BASE+30*4)
- #define INTERRUPT_LEVEL_15 (TRAP_VECTOR_BASE+31*4)
- #define SETBUS (TRAP_VECTOR_BASE+254*4)
- #define ABORT (TRAP_VECTOR_BASE+255*4)
-
- /*
- * RAM page used to hold the valid main memory pages bitmap if memory
- * fails self-test. This will be mapped invalid if memory was all OK.
- */
- #define MAINMEM_BITMAP ((char *) 0xFFDC2000) /* ??? WRONG! chg later. */
-
- /*
- * Roughly 512K for mapping in devices and main memory during boot.
- * Mapped invalid otherwise (to Invalid PMEG if a whole pmeg invalid).
- */
- #define BOOTMAP_BASE ((char *) 0xFFDC4000) /* ??? WRONG! chg later. */
-
- /*
- * Location of EPROM code. The system executes out of these addresses.
- * If the value of "PROM_BASE", defined below, is changed, several other
- * changes are required. A complete list of required changes is given below.
- * (1) Makefile: RELOC=
- * (2) ../h/sunromvec.h: #define romp
- */
- #define PROM_BASE ((struct sunromvec *) 0xFFE80000)
-
- /*
- * First hardware virtual address where DVMA is possible.
- * The Monitor does not normally use this address range, but
- * does use it during bootstrap, via the resalloc() routine.
- */
- #define DVMA_BASE ((char *) 0xFFF00000)
-
- /*
- * The Monitor maps only as much main memory as it can detect. The rest
- * of the address space (up through the special addresses defined above)
- * is mapped as invalid.
- *
- * The last pmeg in the page map is always filled with PME_INVALID
- * entries. This pmeg number ("The Invalid Pmeg Number") can be used to
- * invalidate an entire segment's worth of memory.
- * B E C A R E F U L !
- * If you change a page map entry in this pmeg, you change it for thousands
- * of virtual addresses. (The standard "getpagemap"/"setpagemap" routines
- * will cause a trap if you attempt to write a valid page map entry to this
- * pmeg, but you could do it by hand if you really wanted to mess things up.)
- *
- * Because there is eight times as much virtual memory space in a single
- * context as there are total pmegs to map it with, much of the monitor's
- * memory map must be re-mappings of the same pmegs. Specifically,
- * NSEGMAP/NUMPMEGS different segment table entries map to each pmeg
- * of the page table. There is no reason to duplicate useful addresses,
- * and several reasons not to, so we map the extra virtual address space
- * with the Invalid Pmeg Number. This means that some of the address space
- * has their own page map entries, and the other part all shares the one
- * Invalid pmeg. Remember this when trying to map things; if the address
- * you want is seg-mapped to the Invalid pmeg, you had better find it a
- * pmeg before you set a page map entry.
- *
- * The Monitor always uses page map entry PME_INVALID to map an invalid
- * page, although the only relevant bits are the (nonzero) permission bits
- * and the (zero) Valid bit. PME_INVALID is defined in ./structconst.h,
- * which is generated by the Monitor makefile.
- */
- #define SEG_INVALID NUMPMEGS-1
- #define EEPROM ((struct eeprom *) 0xFFD04000)
-